/*
JUITTER 1.0.0 - 22/07/2009 - http://juitter.com
BY RODRIGO FANTE - http://rodrigofante.com

** jQuery 1.2.* or higher required

Juitter is distributed under the MIT License
Read more about the MIT License --> http://www.opensource.org/licenses/mit-license.php

This script is just a beta test version, download and use it at your own risk.
The Juitter developer shall have no responsability for data loss or damage of any kind by using this script.
*/
(function ($) {
    var conf = {},
    // JUITTER DEFAULT CONFIGURATION ========================
    // YOU CAN CHANGE THE DYNAMIC VARS ON CALLING THE start method, see the system.js for more information about it.

		numMSG = 20; // set the number of messages to be show
    containerDiv = "juitterContainer", // //Set a place holder DIV which will receive the list of tweets example <div id="juitterContainer"></div>
		loadMSG = "Loading messages...", // Loading message, if you want to show an image, fill it with "image/gif" and go to the next variable to set which image you want to use on 
		imgName = "loader.gif", // Loading image, to enable it, go to the loadMSG var above and change it to "image/gif"
		readMore = "Read it on Twitter", // read more message to be show after the tweet content
		nameUser = "image" // insert "image" to show avatar of "text" to show the name of the user that sent the tweet 
    live: "live-20", //optional, disabled by default, the number after "live-" indicates the time in seconds to wait before request the Twitter API for updates, I do not recommend to use less than 60 seconds.
    // end of configuration

    // some global vars
		aURL = ""; msgNb = 1;
    var mode, param, time, lang, contDiv, loadMSG, gifName, numMSG, readMore, fromID, ultID, filterWords;
    var running = false;
    // Twitter API Urls
    apifMultipleUSER = "http://search.twitter.com/search.json?from%3A";
    apifUSER = "http://search.twitter.com/search.json?q=from%3A";
    apitMultipleUSER = "http://search.twitter.com/search.json?to%3A";
    apitUSER = "http://search.twitter.com/search.json?q=to%3A";
    apiSEARCH = "http://search.twitter.com/search.json?q=";
    $.Juitter = {
        registerVar: function (opt) {
            mode = opt.searchType;
            param = opt.searchObject;
            timer = opt.live;
            lang = opt.lang ? opt.lang : "";
            contDiv = opt.placeHolder ? opt.placeHolder : containerDiv;
            loadMSG = opt.loadMSG ? opt.loadMSG : loadMSG;
            gifName = opt.imgName ? opt.imgName : imgName;
            numMSG = opt.total ? opt.total : numMSG;
            readMore = opt.readMore ? opt.readMore : readMore;
            fromID = opt.nameUser ? opt.nameUser : nameUser;
            filterWords = opt.filter;
            openLink = opt.openExternalLinks ? "target='_blank'" : "";
        },
        start: function (opt) {
            ultID = 0;
            if ($("#" + contDiv)) {
                this.registerVar(opt);
                // show the load message
                this.loading();
                // create the URL  to be request at the Twitter API
                aURL = this.createURL();
                // query the twitter API and create the tweets list
                this.conectaTwitter(1);
                // if live mode is enabled, schedule the next twitter API query
                if (timer != undefined && !running) this.temporizador();
            }
        },
        update: function () {
            this.conectaTwitter(2);
            if (timer != undefined) this.temporizador();
        },
        loading: function () {
            if (loadMSG == "image/gif") {
                $("<img id='loadimg'></img>")
					.attr('src', gifName)
					.appendTo("#" + contDiv);

                //$("<span id='loadText'></span>").html("  Loading Feed...").appendTo("#" + contDiv);

            } else $("#" + contDiv).html(loadMSG);
        },
        createURL: function () {
            var url = "";
            jlg = lang.length > 0 ? "&lang=" + lang : jlg = "";
            var seachMult = param.search(/,/);
            if (seachMult > 0) param = "&ors=" + param.replace(/,/g, "+");
            if (mode == "fromUser" && seachMult <= 0) url = apifUSER + param;
            else if (mode == "fromUser" && seachMult >= 0) url = apifMultipleUSER + param;
            else if (mode == "toUser" && seachMult <= 0) url = apitUSER + param;
            else if (mode == "toUser" && seachMult >= 0) url = apitMultipleUSER + param;
            else if (mode == "searchWord") url = apiSEARCH + param + jlg;
            url += "&rpp=" + numMSG;
            return url;
        },
        delRegister: function () {
            // remove the oldest entry on the tweets list
            if (msgNb >= numMSG) {
                $(".twittLI").each(
					function (o, elemLI) {
					    if (o >= numMSG) $(this).hide("slow");
					}
				);
            }
        },
        conectaTwitter: function (e) {
            // query the twitter api and create the tweets list
            $.ajax({
                url: aURL,
                type: 'GET',
                dataType: 'jsonp',
                timeout: 1000,
                error: function () { $("#" + contDiv).html("fail#"); },
                success: function (json) {
                    if (e == 1) $("#" + contDiv).html("");
                    $.each(json.results, function (i, item) {
                        if (e == 1 || (i < numMSG && item.id > ultID)) {
                            if (i == 0) {
                                tultID = item.id;
                                $("<ul></ul>")
									.attr('id', 'twittList' + ultID)
									.attr('class', 'twittList')
									.prependTo("#" + contDiv);
                            }
                            if (item.text != "undefined") {
                                var link = "http://twitter.com/" + item.from_user + "/status/" + item.id;

                                var tweet = $.Juitter.filter(item.text);

                                if (fromID == "image") mHTML = "<a href='http://www.twitter.com/" + item.from_user + "'><img src='" + item.profile_image_url + "' alt='" + item.from_user + "' class='juitterAvatar' /></a> " + $.Juitter.textFormat(tweet) + " -| <span class='time'>" + item.created_at + "</span> |- <a href='" + link + "' class='JRM' " + openLink + ">" + readMore + "</a>";
                                else mHTML = "<a href='http://www.twitter.com/" + item.from_user + "'>@" + item.from_user + ":</a> " + $.Juitter.textFormat(tweet) + " -| <span class='time'>" + item.created_at + "</span> |-  <a href='" + link + "' " + openLink + ">" + readMore + "</a>";

                                $("<li></li>")
									.html(mHTML)
									.attr('id', 'twittLI' + msgNb)
									.attr('class', 'twittLI')
									.appendTo("#twittList" + ultID);

                                $('#twittLI' + msgNb).hide();
                                $('#twittLI' + msgNb).show("slow");

                                // remove old entries
                                $.Juitter.delRegister();
                                msgNb++;
                            }
                        }
                    });
                    ultID = tultID;
                }
            });
        },
        filter: function (s) {
            if (filterWords) {
                searchWords = filterWords.split(",");
                if (searchWords.length > 0) {
                    cleanHTML = s;
                    $.each(searchWords, function (i, item) {
                        sW = item.split("->").length > 0 ? item.split("->")[0] : item;
                        rW = item.split("->").length > 0 ? item.split("->")[1] : "";
                        regExp = eval('/' + sW + '/gi');
                        cleanHTML = cleanHTML.replace(regExp, rW);
                    });
                } else cleanHTML = s;
                return cleanHTML;
            } else return s;
        },
        textFormat: function (texto) {
            //make links
            var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
            texto = texto.replace(exp, "<a href='$1' class='extLink' " + openLink + ">$1</a>");
            var exp = /[\@]+([A-Za-z0-9-_]+)/ig;
            texto = texto.replace(exp, "<a href='http://twitter.com/$1' class='profileLink'>@$1</a>");
            var exp = /[\#]+([A-Za-z0-9-_]+)/ig;
            texto = texto.replace(exp, "<a href='http://juitter.com/#$1' onclick='$.Juitter.start({searchType:\"searchWord\",searchObject:\"$1\"});return false;' class='hashLink'>#$1</a>");
            // make it bold
            if (mode == "searchWord") {
                tempParam = param.replace(/&ors=/, "");
                arrParam = tempParam.split("+");
                $.each(arrParam, function (i, item) {
                    regExp = eval('/' + item + '/gi');
                    newString = new String(' <b>' + item + '</b> ');
                    texto = texto.replace(regExp, newString);
                });
            }
            return texto;
        },
        temporizador: function () {
            // live mode timer
            running = true;
            aTim = timer.split("-");
            if (aTim[0] == "live" && aTim[1].length > 0) {
                tempo = aTim[1] * 1000;
                setTimeout("$.Juitter.update()", tempo);
            }
        }
    };
})(jQuery);